 1.Spark GraphX之Spark GraphX概述
   
   GraphX 是 Spark 一个组件，专门用来表示图以及进行图的并行计算。GraphX 通过
重新定义了图的抽象概念来拓展了 RDD： 定向多图，其属性附加到每个顶点和边。
   为了支持图计算， GraphX 公开了一系列基本运算符（比如：mapVertices、
mapEdges、subgraph）以及优化后的 Pregel API 变种。此外，还包含越来越多的
图算法和构建器，以简化图形分析任务。
   GraphX在图顶点信息和边信息存储上做了优化，使得图计算框架性能相对于原生
RDD实现得以较大提升，接近或到达 GraphLab 等专业图计算平台的性能。GraphX
最大的贡献是，在Spark之上提供一栈式数据解决方案，可以方便且高效地完成图计
算的一整套流水作业。
   
   1).图的相关术语
   图是一种较线性表和树更为复杂的数据结构，图表达的是多对多的关系。
   如下图所示，G1 是一个简单的图，其中 V1、V2、V3、V4 被称作顶点（Vertex），
任意两个顶点之间的通路被称为边（Edge），它可以由（V1、V2）有序对来表示，
这时称 G1 为有向图，意味着边是有方向的，若以无序对来表示图中一条边，则该图
为无向图，如 G2。
   在 G1 中，与顶点相关联的边的数量被称为顶点的度（Degree）。其中，以顶点为
起点的边的数量被称为该顶点的出度（OutDegree），以顶点为终点的边的数量被
称为该顶点的入度（InDegree）。
   以 G1 中的 V1 举例，V1 的度为 3,其中出度为 2,入度为 1. 在无向图 G2 中，如
果任意两个顶点之间是连通的，则称 G2 为连通图（Connected Graph）。在有向图
中 G1 中，如果任意两个顶点 Vm、Vn 且 m ≠ n，从 Vm 到 Vn 以及从 Vn 到 Vm 之
间都存在通路，则称 G1 为强连通图（Strongly Connected Graph）。任意两个顶
点之间若存在通路，则称为路径（Path），用一个顶点序列表示，若第一个顶点和
最后一个顶点相同，则称为回路或者环（Cycle）。
   2).图数据库与图计算
   Neo4j 是一个比较老牌的开源图数据库，目前在业界的使用也较为广泛，它提供了
一种简单易学的查询语言 Cypher。
   Neo4j 支持交互式查询，查询效率很高。能够迅速从整网中找出符合特定模式的子
网，供随后分析之用，适用于OLTP 场景。
   Neo4j 是图数据库，偏向于存储和查询。能存储关联关系比较复杂，实体之间的连接
丰富。比如社交网络、知识图谱、金融风控等领域的数据。擅长从某个点或某些点出
发，根据特定条件在复杂的关联关系中找到目标点或边。如在社交网络中找到某个点
三步以内能认识的人，这些人可以认为是潜在朋友。数据量限定在一定范围内，能短
时完成的查询就是所谓的OLTP操作。
   Neo4j 查询与插入速度较快，没有分布式版本，容量有限，而且一旦图变得非常大，
如数十亿顶点，数百亿边，查询速度将变得缓慢。Neo4j 分为社区版和企业版，企业
版有一些高级功能，需要授权，价格昂贵。
   比较复杂的分析和算法，如基于图的聚类，PageRank 算法等，这类计算任务对于图
数据库来说就很难胜任了，主要由一些图挖掘技术来负责。
   Pregel 是 Google 于 2010 年在 SIGMOD 会议上发表的《Pregel: A System for
Large-Scale Graph Processing》论文中提到的海量并行图挖掘的抽象框架,Pregel
与Dremel一样,是Google新三驾马车之一,它基于 BSP 模型(Bulk Synchronous 
Parallel,整体同步并行计算模型),将计算分为若干个超步(super step),在超步内,
通过消息来传播顶点之间的状态。Pregel可以看成是同步计算,即等所有顶点完成处
理后再进行下一轮的超步,Spark基于Pregel论文实现的海量并行图挖掘框架GraphX。
   3).图计算模式
   目前基于图的并行计算框架已经有很多，比如来自Google的Pregel、来自Apache开
源的图计算框架Giraph / HAMA以及最为著名的GraphLab，其中Pregel、HAMA和Giraph
都是非常类似的，都是基于BSP模式。
   BSP即整体同步并行，它将计算分成一系列超步的迭代。从纵向上看，它是一个串行
模式，而从横向上看，它是一个并行的模式，每两个超步之间设置一个栅栏(barrier),
即整体同步点，确定所有并行的计算都完成后再启动下一轮超步。
   每一个超步包含三部分内容：
      计算compute：每一个processor利用上一个超步传过来的消息和本地的数据进
行本地计算
      消息传递：每一个processor计算完毕后，将消息传递个与之关联的其它processors
	  整体同步点：用于整体同步，确定所有的计算和消息传递都进行完毕后，进入下
一个超步
